package br.com.sgi.util;



import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpServlet;

import org.richfaces.component.html.HtmlCalendar;
import org.richfaces.model.CalendarDataModel;
import org.richfaces.model.CalendarDataModelItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.sgi.model.Agenda;
import br.com.sgi.service.AgendaService;



/**
 * @author Ilya Shaikovsky
 *
 */
@Controller("calendarDataModel")
@Scope("session")
public class CalendarDataModelImpl extends HttpServlet  implements CalendarDataModel {

    /* (non-Javadoc)
     * @see org.richfaces.component.CalendarDataModel#getData(java.util.Date[])
     */
    
	private String tipoCompromisso;
	private String titulo;
	private Date dtCompromisso;
	private String horaInicio;
	private String horaFim;
	private String descricao;
	private String dataAlterada;
	private String exibirToolTip;
	
	private String diaSelecionado;
	
	private Agenda compromissoSelecionado;
	
	private Agenda agenda;
	
	@Autowired
	private AgendaService agendaService;
	
    private CalendarDataModelItem[] items;
    
    private HtmlCalendar eventsCalendarControl = new HtmlCalendar();
    
    private String currentDescription;
    private String currentShortDescription;
    private Date currentDate;
    private boolean currentDisabled;
    
	private Object data;
	
	private String dados;
   
	private String compromisso;
	
	private Map<String, List<Agenda>> mapDiaCompromisso = new HashMap<String, List<Agenda>>();
    
	private List<Agenda> listaCompromisso;
	
	
	
	
    
    /* (non-Javadoc)
     * @see org.richfaces.model.CalendarDataModel#getData(java.util.Date[])
     */
    public CalendarDataModelItem[] getData(Date[] dateArray) {
        if (dateArray == null) {
            return null;
        }
        if (items==null) {  
            items = new CalendarDataModelItem[dateArray.length];
            for (int i = 0; i < dateArray.length; i++) {
                items[i] = createDataModelItem(dateArray[i]);
            }
        }
        return items;
    }

    /**
     * @param date
     * @return CalendarDataModelItem for date
     */
    protected CalendarDataModelItem createDataModelItem(Date date) {
        CalendarDataModelItemImpl item = new CalendarDataModelItemImpl();
        Map <String, String> data = new HashMap<String, String>();
        
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        item.setDay(c.get(Calendar.DAY_OF_MONTH));
        
        int diaSemana = c.get(Calendar.DAY_OF_MONTH);  
        
        
        List<Agenda> compromissos = agendaService.buscarAgendasPorMesAno(DateUtil.getDateStr(date));
        
        if(compromissos != null){
        	
        	mapDiaCompromisso.put(String.valueOf(diaSemana), compromissos);
        }
        
      
        data.put("adicionar", "Add");
        
        item.setEnabled(true);        
        if(compromissos != null && compromissos.size() > 0)
        	item.setStyleClass("cellExisteCompromisso");
        else
        	item.setStyleClass("rel-hol");
        
        item.setData(data); 
        item.setToolTip("");
        return item;
    } 
    
	
    /* (non-Javadoc)
     * @see org.richfaces.model.CalendarDataModel#getToolTip(java.util.Date)
     */
    public Object getToolTip(Date date) {
    
        // TODO Auto-generated method stub
        return getCurrentDate();
    }

    /**
     * @return items
     */
    public CalendarDataModelItem[] getItems() {
        return items;
    }

    /**
     * @param setter for items
     */
    public void setItems(CalendarDataModelItem[] items) {
        this.items = items;
    }
    
    /**
     * carrega compromissos cadastrados
     */
    public void carregarCompromisso(){
    	 
    	String[] dadosRetirados = obterDia(diaSelecionado);
    	String dia = dadosRetirados[0];
    	if(dia != null){
    		compromissoSelecionado = null;
    		listaCompromisso =  mapDiaCompromisso.get(dia);
    	}
    
    	
    }

    /**
     * @param valueChangeEvent handling
     */
    public void valueChanged(ValueChangeEvent event) {
    	if(event.getNewValue() != null){
	        System.out.println(event.getNewValue()+"selected");
	        setCurrentDate((Date)event.getNewValue());
	        Calendar calendar = Calendar.getInstance();
	        calendar.setTime(getCurrentDate());
	        setCurrentDescription((String)((HashMap)items[calendar.get(Calendar.DAY_OF_MONTH)-1].getData()).get("description"));
	        setCurrentShortDescription((String)((HashMap)items[calendar.get(Calendar.DAY_OF_MONTH)-1].getData()).get("shortDescription"));
    	}
    }
    
    
    /**
     * carregas compromissos da data corrente
     */
    public void recarregarCalendario(){
//    	String[] contemData2 = null;
//    	String mes = "";
//    	String ano = "";
//    	String numeroMes;
//    	String[] contemData = getDataAlterada().split(">>>");
//    	if(contemData != null && contemData.length > 0)
//    		contemData2 = contemData[0].toString().split(",");
//    	if(contemData2 != null && contemData2.length > 1){
//    			mes = contemData2[0].substring(3,contemData2[0].toString().length()).trim();
//    			numeroMes = buscarNumeroMes(mes);
//    			ano = contemData2[1].trim();
//    	}
    	items = null;
    	
    }
   

    /**
     * Storing changes action
     */
    public void storeDayDetails() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(getCurrentDate());
        ((HashMap)items[calendar.get(Calendar.DAY_OF_MONTH)-1].getData()).put("shortDescription", getCurrentShortDescription());
        ((HashMap)items[calendar.get(Calendar.DAY_OF_MONTH)-1].getData()).put("description", getCurrentDescription());
        ((HashMap)items[calendar.get(Calendar.DAY_OF_MONTH)-1].getData()).put("dateCurrent", Calendar.DAY_OF_MONTH);
        
        salvarCompromisso();
    }
    
    
    /**
     * exibe compromisso cadastrados
     */
    public void exibirCompromisso( ){
    	String dia = null;
    	String add = "";
    	String [] ds;
    	String[] dadosRetirados = null;
    	exibirToolTip = "ND";
    	if(dados != null){
    		ds = dados.split("A");
    		if(ds != null && ds.length > 1)
    			dia =  ds[0];
    		if(ds != null && ds.length == 2)
    			add = ds[1];
    		if(dia != null)
    			dia = dia.substring(0, dia.length() - 1);
    	}
    	if(listaCompromisso != null)
    		listaCompromisso = new ArrayList<Agenda>();
    	
    	dadosRetirados = obterDia(dados);
    	
    	if(dadosRetirados[0] != null && dadosRetirados[1] != null){ 
	    	if(dia != null && add != null && add.equals("dd")){
	    		listaCompromisso =  mapDiaCompromisso.get(dia);
	    		if(listaCompromisso != null && listaCompromisso.size() > 0){
	    			exibirToolTip = "EC";
	    		}else
	    			exibirToolTip = "AC";
	    	}
    	}
    	
    	
    }
    
    /**
     * 
     * @param dados
     * @return
     */
    private String[] obterDia(String dados){
    	String dia = null;
    	String add = null;
    	String [] ds;
    	String[] dadosRetirados = {null,null};
    	exibirToolTip = "ND";
    	if(dados != null){
    		ds = dados.split("A");
    		//obtem dia com espaco
    		if(ds != null && ds.length > 1)
    			dia =  ds[0];
    		//remove o espaco depois do dia
    		if(dia != null && !dia.isEmpty()){
    			dia = dia.substring(0, dia.length() - 1);
    			dadosRetirados[0] = dia;
    		}
    		//pega a descricao dd
    		if(ds != null && ds.length == 2){
    			add = ds[1];
    			dadosRetirados[1] = add;
    		}
    	}
    	
    	return dadosRetirados;
    }
    
    /**
     * Salva compromisso
     */
    private void salvarCompromisso(){

    	for(Agenda ag: listaCompromisso){
    		if(ag.getCoSeqAgenda() == null)
    			agendaService.salvar(ag);
    		else
    			agendaService.update(ag);
    	}
    	
    	items = null;
    }
    
    /**
     * remove compromisso
     */
    public void removerCompromisso(){
    	if(compromissoSelecionado != null){
    		listaCompromisso.remove(compromissoSelecionado);
    		Mensagem.infoMsg("sucesso.MSG_03");
    	}
    }
   
    /**
     * editar compromisso
     */
    public void editarCompromisso(){
    	if(compromissoSelecionado != null){
    		agenda.setCoSeqAgenda(compromissoSelecionado.getCoSeqAgenda());
    		agenda.setData(compromissoSelecionado.getData());
    		agenda.setDescricao(compromissoSelecionado.getDescricao());
    		agenda.setHoraFim(compromissoSelecionado.getHoraFim());
    		agenda.setHoraInicio(compromissoSelecionado.getHoraInicio());
    		agenda.setTipo(compromissoSelecionado.getTipo());
    		agenda.setTitulo(compromissoSelecionado.getTitulo());    		
    	}
    }
    
    /**
     * adicionar compromisso
     */
    public void adicionarCompromisso(){
    	if(agenda != null){
    		if(agenda.getCoSeqAgenda() == null)
    			listaCompromisso.add(agenda);
    		else{
    			for(Agenda ag: listaCompromisso){
    				if(ag.getCoSeqAgenda().equals(agenda.getCoSeqAgenda())){
	    				ag.setData(agenda.getData());
	    				ag.setDescricao(agenda.getDescricao());
	    				ag.setHoraFim(agenda.getHoraFim());
	    				ag.setHoraInicio(agenda.getHoraInicio());
	    				ag.setTipo(agenda.getTipo());
	    				ag.setTitulo(agenda.getTitulo());  
	    				break;
    				}
    			}
    		}
    		agenda = new Agenda();
    	}
    }
    
   
    
    /**
     * @return currentDescription
     */
    public String getCurrentDescription() {
        return currentDescription;
    }

    /**
     * @param currentDescription
     */
    public void setCurrentDescription(String currentDescription) {
        this.currentDescription = currentDescription;
    }

    /**
     * @return currentDisabled
     */
    public boolean isCurrentDisabled() {
        return currentDisabled;
    }

    /**
     * @param currentDisabled
     */
    public void setCurrentDisabled(boolean currentDisabled) {
        this.currentDisabled = currentDisabled;
    }

    /**
     * @return currentShortDescription
     */
    public String getCurrentShortDescription() {
        return currentShortDescription;
    }

    /**
     * @param currentShortDescription
     */
    public void setCurrentShortDescription(String currentShortDescription) {
        this.currentShortDescription = currentShortDescription;
    }

    /**
     * @return currentDate
     */
    public Date getCurrentDate() {
        return currentDate;
    }

    /**
     * @param currentDate
     */
    public void setCurrentDate(Date currentDate) {
        this.currentDate = currentDate;
    }

	public Object getData() {
		return data;
	}

	public String getDados() {
		return dados;
	}

	public void setDados(String dados) {
		this.dados = dados;
	}

	public void setData(Object data) {
		this.data = data;
	}

	public HtmlCalendar getEventsCalendarControl() {
		return eventsCalendarControl;
	}

	public void setEventsCalendarControl(HtmlCalendar eventsCalendarControl) {
		this.eventsCalendarControl = eventsCalendarControl;
	}

	public String getCompromisso() {
		return compromisso;
	}

	public void setCompromisso(String compromisso) {
		this.compromisso = compromisso;
	}

	public List<Agenda> getListaCompromisso() {
		return listaCompromisso;
	}

	public void setListaCompromisso(List<Agenda> listaCompromisso) {
		this.listaCompromisso = listaCompromisso;
	}

	public String getTipoCompromisso() {
		return tipoCompromisso;
	}

	public void setTipoCompromisso(String tipoCompromisso) {
		this.tipoCompromisso = tipoCompromisso;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public Date getDtCompromisso() {
		return dtCompromisso;
	}

	public void setDtCompromisso(Date dtCompromisso) {
		this.dtCompromisso = dtCompromisso;
	}

	public String getHoraInicio() {
		return horaInicio;
	}

	public void setHoraInicio(String horaInicio) {
		this.horaInicio = horaInicio;
	}

	public String getHoraFim() {
		return horaFim;
	}

	public void setHoraFim(String horaFim) {
		this.horaFim = horaFim;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getDataAlterada() {
		return dataAlterada;
	}

	public void setDataAlterada(String dataAlterada) {
		this.dataAlterada = dataAlterada;
	}

	public String getExibirToolTip() {
		return exibirToolTip;
	}

	public void setExibirToolTip(String exibirToolTip) {
		this.exibirToolTip = exibirToolTip;
	}

	public Agenda getCompromissoSelecionado() {
		return compromissoSelecionado;
	}

	public void setCompromissoSelecionado(Agenda compromissoSelecionado) {
		this.compromissoSelecionado = compromissoSelecionado;
	}

	public String getDiaSelecionado() {
		return diaSelecionado;
	}

	public void setDiaSelecionado(String diaSelecionado) {
		this.diaSelecionado = diaSelecionado;
	}

	public Agenda getAgenda() {
		if(agenda == null)
			agenda = new Agenda();
		return agenda;
	}

	public void setAgenda(Agenda agenda) {
		this.agenda = agenda;
	}

	
}